import { getAreaByCoordinates } from './geocodingService.js'

// 天气服务
// 注意：这里使用模拟数据，实际项目中需要替换为真实的天气API

// 你的高德Web服务Key
const AKEY = 'd93428c62f0f8fcbcbe1be9e05893e41'; // 请替换为你自己的高德Web服务Key

/**
 * 获取天气信息
 * @param {number} latitude - 纬度
 * @param {number} longitude - 经度
 * @returns {Promise<Object>} 天气数据
 */
export const getWeatherData = async (latitude, longitude) => {
  try {
    // 模拟API调用延迟
    await new Promise(resolve => setTimeout(resolve, 1000))
    
    // 模拟天气数据
    // 实际项目中，这里应该调用真实的天气API，比如：
    // - 和风天气API: https://dev.qweather.com/
    // - 高德天气API: https://lbs.amap.com/api/webservice/guide/api/weatherinfo
    // - 心知天气API: https://www.seniverse.com/
    
    const weatherTypes = [
      { type: '晴', temp: [15, 30], humidity: [30, 60] },
      { type: '多云', temp: [10, 25], humidity: [40, 70] },
      { type: '阴', temp: [8, 22], humidity: [50, 80] },
      { type: '小雨', temp: [5, 18], humidity: [60, 90] },
      { type: '中雨', temp: [3, 15], humidity: [70, 95] },
      { type: '雪', temp: [-5, 5], humidity: [40, 70] }
    ]
    
    const randomWeather = weatherTypes[Math.floor(Math.random() * weatherTypes.length)]
    const temp = Math.floor(Math.random() * (randomWeather.temp[1] - randomWeather.temp[0])) + randomWeather.temp[0]
    const humidity = Math.floor(Math.random() * (randomWeather.humidity[1] - randomWeather.humidity[0])) + randomWeather.humidity[0]
    
    return {
      temp,
      weather: randomWeather.type,
      humidity,
      windSpeed: Math.floor(Math.random() * 20) + 5, // 5-25km/h
      visibility: Math.floor(Math.random() * 10) + 5, // 5-15km
      city: '保定市', // 实际项目中应该根据经纬度获取城市名
      updateTime: new Date().toLocaleString('zh-CN')
    }
  } catch (error) {
    console.error('获取天气数据失败:', error)
    throw error
  }
}

/**
 * 根据经纬度获取城市名称
 * @param {number} latitude - 纬度
 * @param {number} longitude - 经度
 * @returns {Promise<string>} 城市名称
 */
export const getCityName = async (latitude, longitude) => {
  try {
    // 使用地理编码服务获取区域信息
    const area = getAreaByCoordinates(latitude, longitude)
    return `保定市${area}`
  } catch (error) {
    console.error('获取城市名称失败:', error)
    return '保定市'
  }
}

/**
 * 获取未来几天的天气预报
 * @param {number} latitude - 纬度
 * @param {number} longitude - 经度
 * @param {number} days - 天数，默认3天
 * @returns {Promise<Array>} 天气预报数组
 */
export const getWeatherForecast = async (latitude, longitude, days = 3) => {
  try {
    await new Promise(resolve => setTimeout(resolve, 500))
    
    const forecast = []
    const weatherTypes = ['晴', '多云', '阴', '小雨', '中雨', '雪']
    
    for (let i = 0; i < days; i++) {
      const date = new Date()
      date.setDate(date.getDate() + i)
      
      forecast.push({
        date: date.toLocaleDateString('zh-CN'),
        weather: weatherTypes[Math.floor(Math.random() * weatherTypes.length)],
        tempMax: Math.floor(Math.random() * 15) + 15, // 15-30度
        tempMin: Math.floor(Math.random() * 10) + 5,  // 5-15度
        humidity: Math.floor(Math.random() * 40) + 40, // 40-80%
        windSpeed: Math.floor(Math.random() * 20) + 5  // 5-25km/h
      })
    }
    
    return forecast
  } catch (error) {
    console.error('获取天气预报失败:', error)
    throw error
  }
}

/**
 * 根据adcode获取天气信息
 * @param {string} adcode - 城市编码
 * @returns {Promise<Object|null>} 天气数据
 */
export const getWeatherDataByAdcode = async (adcode) => {
  try {
    const url = `https://restapi.amap.com/v3/weather/weatherInfo?city=${adcode}&key=${AKEY}&extensions=base`;
    const response = await fetch(url);
    const data = await response.json();

    if (data.status === '1' && data.lives && data.lives.length > 0) {
      const liveWeather = data.lives[0];
      return {
        temp: liveWeather.temperature,
        weather: liveWeather.weather,
        humidity: liveWeather.humidity,
        windSpeed: liveWeather.windpower,
        windDirection: liveWeather.winddirection,
        city: liveWeather.city,
        reportTime: liveWeather.reporttime,
      };
    } else {
      console.error('获取天气信息失败:', data.info);
      return null;
    }
  } catch (error) {
    console.error('请求天气信息失败:', error);
    return null;
  }
}; 